/* Soubor je ulozen v kodovani UTF-8.
 * Kontrola kódování: Příliš žluťoučký kůň úpěl ďábelské ódy.
 */
package cz.pecinovsky.česky.oopnz.utility;



////////////////////////////////////////////////////////////////////////////////
//%%+  +++++ Konec ignorovaného počátečního textu - prostor pro importy +++++

//%X+ xxxxx Začátek přeskakovaného textu s deklarací obalové třídy xxxxx
/*******************************************************************************
 *<pre>
 * Předchozí:   Není - toto_je_nově_definovaná_třída
 *              Ttt v projektu Ppp
 * Následující: Prozatím není
 *
 * Projekt  Ppp
 *   + Přidáno
 *   - Odebráno
 *   ~ Změněno
 *</pre>
 *
 * @author Rudolf PECINOVSKÝ
 * @version 6.03.2017 — 2010-11-08
 */
////////////////////////////////////////////////////////////////////////////////
//%X- ----- Konec přeskakovaného textu s deklarací obalové třídy -----


/*******************************************************************************
 * Instance třídy {@code Rozměr} představují přepravky uchovávající informace
 * o rozměrech objektu.
 * Proto jsou jejich atributy deklarovány jako veřejné konstanty.
 *
 * @author Rudolf PECINOVSKÝ
 * @version 6.03.2017 — 2010-11-08
 */
public class Rozměr
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================
//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== STATICKÝ INICIALIZAČNÍ BLOK - STATICKÝ KONSTRUKTOR ========================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================

    /** Šířka objektu. */
    public final int šířka;

    /** Výška objektu. */
    public final int výška;



//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ NESOUKROMÉ METODY TŘÍDY ===========================================

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================

    /***************************************************************************
     * Vytvoří přepravku uchovávající zadané rozměry.
     *
     * @param šířka  Šířka objektu
     * @param výška  Výška objektu
     */
    public Rozměr( int šířka, int výška )
    {
        this.šířka = šířka;
        this.výška = výška;
    }



//== ABSTRAKTNÍ METODY =========================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================

    /***************************************************************************
     * Vrátí uloženo velikost šířky objektu.
     *
     * @return  Velikost šířky
     */
    public int getŠířka()
    {
        return šířka;
    }


    /***************************************************************************
     * Vrátí velikost výšky objektu.
     *
     * @return  Velikost výšky
     */
    public int getVýška()
    {
        return výška;
    }



//== OSTATNÍ NESOUKROMÉ METODY INSTANCÍ ========================================
//%A+ >127

    /***************************************************************************
     * Vrátí informaci o tom, představuje-li instance zadaná v parametru
     * stejný rozměr.
     *
     * @param  o   Testovaná instance
     * @return Je-li zadaná instance rozměrem se stejnými hodnotami atributů,
     *         vrátí {@code true}, jinak vrátí {@code false}.
     */
    @Override
    public boolean equals( Object o )
    {
//%A-
//%I+ >127 -135
//        return (o instanceof Rozměr)              &&
//               (((Rozměr)o).šířka == this.šířka)  &&
//               (((Rozměr)o).výška == this.výška);
//%I-
//%A+ >135
        if (! (o instanceof Rozměr))  {
            return false;               //==========>
        }
        Rozměr r = (Rozměr)o;
        return (r.šířka == šířka) && (r.výška == výška);
//%A-
//%A+ >127
    }

//%A-
//%X+ <999

    /***************************************************************************
     * Vrátí heš-kód dané instance.
     *
     * @return  Heš-kód
     */
    @Override
    public int hashCode()
    {
        return 1234567 + 37*(37*šířka + výška);
    }

//%X-
//%X+ <126

    /***************************************************************************
     * Vrací textovou reprezentaci (podpis) dané instance
     * používanou především k ladicím účelům.
     *
     * @return Požadovaná textová reprezentace
     */
    @Override
    public String toString()
    {
        return "Rozměr:[šířka=" + šířka + ", výška=" + výška + "]";
    }

//%X-
//%X+ <999

    /***************************************************************************
     * Vrátí novou instanci vzniklou zvětšení šířky a výšky této instance
     * o zadaný počet bodů.
     *
     * @param  dšířka   Změna šířky (>0=zvětšit, <0=zmenšit)
     * @param  dvýška   Změna výšky (>0=zvětšit, <0=zmenšit)
     * @return Upravený
     */
    public Rozměr zvětšiO( int dšířka, int dvýška )
    {
        return new Rozměr( šířka + dšířka,  výška + dvýška );
    }


    /***************************************************************************
     * Vrátí novou instanci vzniklou zvětšení šířky a výšky této instance
     * o zadaný počet bodů.
     *
     * @param  rozměr  Instance s atributy obsahujícími požadované změny
     * @return Rozměr po zadaných změnách
     */
    public Rozměr zvětšiO(Rozměr rozměr)
    {
        return new Rozměr( šířka + rozměr.šířka,  výška + rozměr.výška );
    }



//%X-
//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================
//== INTERNÍ DATOVÉ TYPY =======================================================
//== TESTY A METODA MAIN =======================================================
//
//    /***************************************************************************
//     * Testovací metoda.
//     */
//    public static void test()
//    {
//        Rozměr inst = new Rozměr();
//    }
//    /** @param args Parametry příkazového řádku - nepoužívané. */
//    public static void main( String[] args )  {  test();  }
}
